package `02-lambda_rxjava`.rxjava03

//函数体中从it变为this且this可以省略
fun main() {
    //create函数 无输入，输出是Helper对象，对象中的变量item = "我是字符串"
    create{
        "我是字符串"  //create操作符函数体的输出，map操作符函数体的输入
    }
    //map函数是Helper类的函数，输入是create函数输出对象中的item（“我是字符串”），输出是Helper对象，对象中的变量item = 5（it.length）
    .map{
         length  //当前操作符函数体的输出，下一个map操作符函数体的输入
    }
    //map函数是Helper类的函数，输入是上面map函数输出对象中的item（5），输出是Helper对象，对象中的变量item = "【$it】"
    .map{
         "【$this】" //当前操作符函数体的输出，consumer操作符函数体的输入
    }
    //consumer函数是Helper类的函数，输入是上面map函数输出对象中的item（【5】），输出是Unit
    .consumer{
        println("内容的长度是$this")
    }
}

fun <R> create(action:()->R):Helper<R>{
    var newItem:R = action()
    return Helper<R>(newItem)
}

public class Helper<T>(private var item:T){
    fun <R> map(action:T.()->R):Helper<R>{
        var newItem:R = action.invoke(item)
        return Helper<R>(newItem)
    }

    fun consumer(action:T.()->Unit){
        action(item)
    }
}